#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <unistd.h>
#include <pthread.h>

void *start(void *args)
{
    pthread_detach(pthread_self()); // 1.新线程自己线程分离    2.main函数内 pthread_detach(tid); 设置线程分离
    std::string name = static_cast<const char *>(args);
    while (true)
    {
        std::cout << "i am a new thread" << std::endl;
        sleep(1);
    }
    pthread_exit((void *)10);
}

int main()
{
    pthread_t tid;
    pthread_create(&tid, nullptr, start, (void *)"thread-1");

    sleep(5);

    sleep(5);

    void *ret = nullptr;
    int n = pthread_join(tid, &ret);
    std::cout << "new thread exit, code: " << (long long int)ret << ", n: " << n << std::endl;
} //                   join 的返回值不为0 说明返回失败

// void *start(void *args)
// {
//     std::string name = static_cast<const char *>(args);
//     while (true)
//     {
//         std::cout << "i am a new thread" << std::endl;
//         sleep(1);
//     }
//     // return 0; //新线程退出
//     // exit(1);//任何线程内部调用exit表示进程退出！
//     pthread_exit((void *)10); // 也可以这样 等价于return (void*)10;        //****************** */
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, start, (void *)"thread-1");

//     sleep(5);

//     pthread_cancel(tid);                           // 取消线程 *************************
//     std::cout << "取消线程: " << tid << std::endl; //

//     sleep(5);

//     void *ret = nullptr; // 接收线程的返回值 ret里面保存的就是10
//     pthread_join(tid, &ret);
//     std::cout << "ret: " << (long long int)ret << std::endl; // ret里面保存的就是10 所以直接 (int)ret
//     return 0;
// }

// int *addr = nullptr;

// void *start1(void *args)
// {
//     std::string name = static_cast<const char *>(args);
//     int a = 100;
//     addr = &a; // 修改a的地址
//     while (true)
//     {
//         std::cout << name << "local val a : " << a << std::endl; // 一个线程内的临时变量 其他线程看不到 如果要看到就要传地址
//         sleep(1);
//     }
// }

// void *start2(void *args)
// {
//     std::string name = static_cast<const char *>(args);
//     while (true)
//     {
//         if (addr != nullptr)
//         {
//             std::cout << name << "mod val a : " << (*addr)++ << std::endl; // ++修改a的值
//         }
//         sleep(1);
//     }
// }

// int main()
// {
//     pthread_t tid1, tid2;
//     pthread_create(&tid1, nullptr, start1, (void *)"thread-1");
//     pthread_create(&tid2, nullptr, start2, (void *)"thread-2");

//     pthread_join(tid1, nullptr);
//     pthread_join(tid2, nullptr);

//     return 0;
// }